#ifndef MULTITASKER_H
#define MULTITASKER_H

#define STACK_SIZE 1024*10
#define NAME_SIZE 50

#include "common.h"
#include "isr.h"
#include "tty.h"

#define MIN_PRIORITY 0
#define MAX_PRIORITY 4
#define DEFOULT_PRIORITY 2

#define MAX_TASK 100

#define MAX_SIGNAL 34

typedef void (*sighandler_t)(int signal); 

/*
Posibles estados de un proceso.
*/
typedef enum 
{ 
	Running,
	Ready,
	Blocked_wait,
	Blocked_write,
	Blocked_read,
	Blocked_sleep,
	Zombie
} 
state_t;

typedef struct{
	
	unsigned int esp;
		
	unsigned int cr3;
	
}__attribute__((packed)) entorno_t;

/*
Bloque de control del proceso.
*/
typedef struct{
	
	char name[100];
	/*
	Entero de presencia. en uno si el proceso esta en uso, en cero si tiene basura.
	*/
	int present;
	
	/*
	Estado actual del proceso.
	*/
	state_t state;
	
	entorno_t entorno;
	
	/*
	Variables usadas por el algoritmo de scheduling.
	*/
	int next;
	int prev;

	/*
	ID y ID del padre.
	*/
	int pid;	
	int ppid;
	
	/*
	Informacion persistente luego de exit.
	*/
	int exit_status;
	
	/*
	Lista de zombies.
	*/
	int zombies;
	int next_zombie;
	
	/*
	Lista en la que se esta bloqueado.
	*/
	int next_blocked;
	int* blocked_list;
	
	/*
	Manejadores de señales.
	*/
	sighandler_t signals[MAX_SIGNAL];
	
	/*
	Dice si la tarea fue señalizada y todavia no se ejecuto el manejador.
	*/
	int signal_recived;
	
	/*
	Prioridad del proceso.
	*/
	int priority;
	
	/*
	Ticks que le quedan al proceso por correr.
	*/
	int ticks_to_run;
	
	/*
	Lista de buffers del proceso.
	*/
	int fds[256];
	
	tty_t tty;
	
	
} task_t;


#ifndef TOP_STURCT_H
#define TOP_STURCT_H
/*
Estructuras donde escrive sys_top.
*/
typedef struct{
	char name[100];
	int pid;
	int porcentage;
	char* state;
} top_process_t;

typedef struct{
	int running;
	int blocked;
	int ready;
	int zombies;
	
	int cant;
	
	top_process_t processes[100];

} top_t;
#endif

int get_fd(int i);
tty_t* get_tty();

void add_actual_task_to_block_list(int* first);
void unblock_all_from_when(int* first, state_t state);

void block(int state);
void unblock(int task);

int signaled();

void init_multitasker();
uint32_t scheduler(registers_t* regs);
typedef int (*main)(int argc,char * argv[]);

//REVISAR ESTOO!!!
task_t getActualTask(void);

#endif
 
